/*
 * GbtUnicode.h
 *
 *  Created on: 2017年12月30日
 *      Author: terry
 */

#ifndef GBTUNICODE_H_
#define GBTUNICODE_H_

#include "BasicType.h"

enum GbtUnicodeConst
{
	UNICODE_CENTER_LENGTH = 8,	/// 中心编码长度.
	UNICODE_TRADE_LENGTH = 2,   /// 行业编码长度.

	UNICODE_TYPE_A_LENGTH = 3,  /// 规则A的类型长度.
	UNICODE_SEQ_A_LENGTH = 7,   /// 规则A的序号长度.

	UNICODE_TYPE_B_LENGTH = 2,  /// 规则B的类型长度.
	UNICODE_SEQ_B_LENGTH = 4,   /// 规则B的序号长度.

	UNICODE_A_LENGTH = 20,	/// 规则A的总长度.
	UNICODE_B_LENGTH = 16,	/// 规则B的总长度.

	UNICODE_PART_LENGTH = 8 /// 码段的最大长度(编码规则中各部分编码的最大长度).
};

enum GbtUnicodeCategory
{
    UNICODE_NONE = 0,
	UNICODE_A = 1,  /// 规则A.
	UNICODE_B = 2   /// 规则B.
};


/// 码段编码.
struct GbtPartCode
{
    int num;    /// 整数值.
    /// int maxNum; /// 最大值.
	char code[UNICODE_PART_LENGTH + 1]; /// 编码.
	const char* group;  /// 分组.
	const char* name;   /// 名称.
};

enum GbtNetworkCode
{
	UNICODE_NETWORK_GUARD 	= 0,
	UNICODE_NETWORK_GUARD_MAX  	= 4,
	UNICODE_NETWORK_POLICE 		= 5,
	UNICODE_NETWORK_GOVERMENT 	= 6,
	UNICODE_NETWORK_INTERNET = 7,
	UNICODE_NETWORK_ORG 	 = 8,
	UNICODE_NETWORK_RESERVED = 9,
};

DLLEXPORT const GbtPartCode* gbtFindPartCode(const GbtPartCode* codes, int count, const char* subcode, int size);

DLLEXPORT const GbtPartCode* gbtFindPartCodeInt(const GbtPartCode* codes, int count, int subcode);

/**
 * 将编码解析为整数
 * @param subcode	编码
 * @param size	编码长度
 * @param value		值
 * @return 成功解析字符数
 */
DLLEXPORT int gbtParseInt(const char* subcode, int size, int* value);

/**
 * 列举出行业编码
 * @param ppCode 编码数组, 返回值是静态分配的, 无需 free
 * @return 数组长度
 */
DLLEXPORT int gbtListTradeCode(GbtPartCode** ppCode);

/**
 * 根据编码查找码段
 * @param code  行业编码
 * @param size
 * @return 码段编码, 没有对应值时, 返回NULL
 */
DLLEXPORT const GbtPartCode* gbtFindTradeCode(const char* tradeCode, int size);



/**
 * 列举出类型编码
 * @param ppCode	编码数组
 * @return	数组长度
 */
DLLEXPORT int gbtListTypeCodeA(GbtPartCode** ppCode);

DLLEXPORT const GbtPartCode* gbtFindTypeCodeA(const char* code, int size);

/**
 * 列举出类型编码
 * @param ppCode	编码数组
 * @return	数组长度
 */
DLLEXPORT int gbtListTypeCodeB(GbtPartCode** ppCode);

DLLEXPORT const GbtPartCode* gbtFindTypeCodeB(const char* code, int size);



DLLEXPORT int gbtIsValidLength(const char* code, int size);

/**
 * 是否为有效的统一编码
 * @param code	编码
 * @param size	长度
 * @return	> 0 表示有效
 */
DLLEXPORT int gbtIsUnicode(const char* code, int size);

/**
 * 解析编码规则类型
 * @param code	统一编码
 * @param size	长度
 * @return 编码规则类型 @see GbtUnicodeCategory
 */
DLLEXPORT int gbtGetCategory(const char* code, int size);

/**
 * 解析出中心编码
 * @param code	统一编码
 * @param size	长度
 * @param buffer	输出指针
 * @param maxSize
 * @return 编码长度, <= 0 表示失败
 */
DLLEXPORT int gbtParseCenter(const char* code, int size, char* buffer, int maxSize);

/**
 * 解析出行业编码
 * @param code
 * @param size
 * @param buffer
 * @param maxSize
 * @return 编码长度, <= 0 表示失败
 */
DLLEXPORT int gbtParseTrade(const char* code, int size, char* buffer, int maxSize);

/**
 * 解析出类型编码
 * @param code
 * @param size
 * @param buffer
 * @param maxSize
 * @return 编码长度, <= 0 表示失败
 */
DLLEXPORT int gbtParseType(const char* code, int size, char* buffer, int maxSize);

/**
 * 解析出序号编码
 * @param code
 * @param size
 * @param buffer
 * @param maxSize
 * @return 编码长度, <= 0 表示失败
 */
DLLEXPORT int gbtParseSeq(const char* code, int size, char* buffer, int maxSize);


DLLEXPORT int gbtTypeIs(const char* code, int size, const char* typeCode);

DLLEXPORT int gbtTypeIsOr(const char* code, int size, const char* typeCode);

DLLEXPORT int gbtTypeIsIn(const char* code, int size, const char* minType, const char* maxType);



DLLEXPORT int gbtTypeIsPlatform(const char* code, int size);

DLLEXPORT int gbtTypeIsFrontDevice(const char* code, int size);

DLLEXPORT int gbtTypeIsUser(const char* code, int size);

DLLEXPORT int gbtTypeIsPlatformDevice(const char* code, int size);


DLLEXPORT int gbtTypeIsRelayServer(const char* code, int size);

DLLEXPORT int gbtTypeIsRecordServer(const char* code, int size);


DLLEXPORT int gbtTypeIsGate(const char* code, int size);

DLLEXPORT int gbtTypeIsGroup(const char* code, int size);

DLLEXPORT int gbtTypeIsAudioOut(const char* code, int size);

/**
 * 解析编码类型, 返回整数
 * @param code  统一编码
 * @param size  长度
 * @return  编码类型
 */
DLLEXPORT int gbtTypeParse(const char* code, int size);



#endif /* GBTUNICODE_H_ */
